#include "Sql_list.h"

/**
 * 函数名 Init_Sql_List
 * 参数
 *      @L 需要初始化的 静态表
 * 返回值
 *      无
 * 功能
 *      对静态表进行初始化
 */
void Init_Sql_List(Sql_list *L)
{
    // 对创建的数据做清空
    memset(L->data, 50 * sizeof(L->data[0]), 0);
    // 初始化表的长度 len
    L->len = 0;
}

/** 尾插
 * 函数名 tail_insert_list
 * 参数
 *      @L 需要尾插的 静态表
 *      @data 需要插入的数据
 * 返回值
 *      无
 * 功能
 *      对静态表进行尾插
 */
void tail_insert_list(Sql_list *L, Elenemt_data data)
{
    // 安全判断
    if (NULL == L)
    {
        printf("顺序表 为 NULL \n");
        return;
    }
    if (MAX_SIZ <= L->len)
    {
        printf("顺序表 为 满 \n");
        return;
    }

    // 插入
    L->data[L->len] = data;
    // 迭代
    L->len++;
}

/** 尾删
 * 函数名 tail_del_list
 * 参数
 *      @L 需要尾删的 静态表
 * 返回值
 *      无
 * 功能
 *      对静态表进行尾删
 */

void tail_del_list(Sql_list *L)
{
    // 安排判断
    if (NULL == L)
    {
        printf("顺序表 为 NULL \n");
        return;
    }
    if (0 >= L->len)
    {
        printf("顺序表 内 无数据 \n");
        return;
    }

    // memset(&L->data[L->len] , sizeof(L->data[0]) , 0);

    L->len--;
}

/** 遍历打印
 * 函数名 printf_Sql_List
 * 参数
 *      @L 需要遍历的 静态表
 * 返回值
 *      无
 * 功能
 *      对静态表进行尾插
 */
void printf_Sql_List(Sql_list *L)
{
    // 安全判断
    if (NULL == L)
    {
        printf("顺序表 为 NULL \n");
        return;
    }
    if (0 == L->len)
    {
        printf("顺序表 内 无数据 \n");
        return;
    }

    for (size_t i = 0; i < L->len; i++)
    {
        printf("姓名:%s 性别:%s 年龄:%d 成绩:%d 学号:%d\n",
               L->data[i].name, L->data[i].sex, L->data[i].age,
               L->data[i].sco, L->data[i].id);
    }
}

/** 指定位置插入
 * 函数名 pos_insert_list
 * 参数
 *      @L 需要插入的 静态表
 *      @index 需要插入的位置
 *      @data 需要插入的数据
 * 返回值
 *      无
 * 功能
 *      对静态表进行指定位置插入
 */
void pos_insert_list(Sql_list *L, int index, Elenemt_data data)
{
    // 安全判断
    if (NULL == L)
    {
        printf("顺序表 为 NULL \n");
        return;
    }
    if (MAX_SIZ <= L->len)
    {
        printf("顺序表 为 满 \n");
        return;
    }
    if (0 > index || index > L->len + 1)
    {
        printf("插入位置不合法 \n");
        return;
    }
    for (int i = L->len; i >= index; i--) // i要等于index，否则会导致重复/*1  2  3  4  5   */  /*1  2  3  3  4  5   */
    {
        L->data[i] = L->data[i - 1];
    }
    L->data[index - 1] = data;
    L->len++;
}

/** 指定位置删除
 * 函数名 pos_insert_list
 * 参数
 *      @L 需要删除的 静态表
 *      @index 需要删除的位置
 * 返回值
 *      无
 * 功能
 *      对静态表进行指定位置删除
 */
void pos_del_list(Sql_list *L, int index)
{
    // 安全判断
    if (NULL == L)
    {
        printf("顺序表 为 NULL \n");
        return;
    }
    if (0 > index || index > L->len)
    {
        printf("删除位置不合法 \n");
        return;
    }
    for (int i = index; i < L->len; i++)
    {
        L->data[i - 1] = L->data[i];
    }
    L->len--;
}

/** 顺序表的按名字查找
 * 函数名 find_by_name
 * 参数
 *      @L 需要查找的 静态表
 *      @name 需要查找的姓名
 * 返回值
 *      无
 * 功能
 *      对静态表进行按名字查找
 */

void find_by_name(Sql_list *L, char *name)
{
    if (NULL == L)
    {
        printf("顺序表 为 NULL \n");
        return;
    }
    if (0 == L->len)
    {
        printf("顺序表 内 无数据 \n");
        return;
    }
    for (size_t i = 0; i < L->len; i++)
    {
        if (0 == strcmp(L->data[i].name, name))
        {
            printf("查找成功!!\n姓名:%s 性别:%s 年龄:%d 成绩:%d 学号:%d\n",
                   L->data[i].name, L->data[i].sex,
                   L->data[i].age, L->data[i].sco, L->data[i].id);
            return;
        }
    }
    printf("未找到该姓名 \n");
}

/** 顺序表的按位置查找
 * 函数名 find_by_index
 * 参数
 *      @L 需要查找的 静态表
 *      @index 需要查找的位置
 * 返回值
 *      无
 * 功能
 *      对静态表进行按位置查找
 */
void find_by_index(Sql_list *L, int index)
{
    if (NULL == L)
    {
        printf("顺序表 为 NULL \n");
        return;
    }
    if (0 == L->len)
    {
        printf("顺序表 内 无数据 \n");
        return;
    }
    if (0 > index || index > L->len)
    {
        printf("查不到该学生\n");
        return;
    }
    printf("查找成功!!\n姓名:%s 性别:%s 年龄:%d 成绩:%d 学号:%d\n",
           L->data[index - 1].name, L->data[index - 1].sex,
           L->data[index - 1].age, L->data[index - 1].sco, L->data[index - 1].id);
}

/** 顺序表的判空
 * 函数名 IsEmpty_Sql_List
 * 参数
 *      @L 需要判空的 静态表
 *
 * 返回值
 *      无
 * 功能
 *      对静态表进行判空
 */
int IsEmpty_Sql_List(Sql_list *L)
{
    return (0 == L->len) ? printf("顺序表为空\n") : printf("顺序表不为空\n");
}

/** 顺序表的清空
 * 函数名 Clear_Sql_List
 * 参数
 *      @L 需要清空的 静态表
 *
 * 返回值
 *      无
 * 功能
 *      对静态表进行清空
 */
void Clear_Sql_List(Sql_list *L)
{
    if (NULL == L)
    {
        printf("顺序表 为 NULL \n");
    }
    memset(L->data, 0, sizeof(Elenemt_data) * MAX_SIZ);
    L->len = 0;
    printf("顺序表已清空\n");
}

/** 顺序表的合并
 * 函数名 Merge_Sql_Lists
 * 参数
 *      @L 需要合并的 静态表
 *      @L1 需要合并的 静态表
 *
 * 返回值
 *      合并的静态表
 * 功能
 *      对静态表进行合并
 */
Sql_list *Merge_Sql_Lists(Sql_list *L, Sql_list *L1)
{
    if (NULL == L || NULL == L1)
    {
        printf("顺序表 为 NULL \n");
        return NULL;
    }
    if (MAX_SIZ <= L->len)
    {
        printf("顺序表为满 \n");
        return NULL;
    }
    for (int i = 0; i < L1->len; i++)
    {
        pos_insert_list(L, L->len + 1, L1->data[i]);
    }
    printf("合并成功\n");
    return L;
}